package com.tedu.review.day02;

import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;

/**
 *  普通类  √
 *  抽象类=抽象方法    关键字 abstract
 *  只有行为的概念，没有具体的实现行为
 *
 *  与面向对象的多态有绝对关系
 *  产生子类【实现类】同时具备属性和方法
 *
 *  什么情况下使用？
 *  复杂项目时，需要在不同类中实现，不同功能，首选抽象类【Android常用】
 *
 *  定义抽象类：
 *  修饰符 abstract class 类名{}  抽象类本身没有任何意义
 *  创建抽象类同时必须存在抽象方法：
 *  修饰符 abstract 返回值 方法名（）;  定义抽象的方法，提供给子类使用
 *
 *  抽象类如何实例化：
 *  必须使用多态，向上造型，自身无法实例化，子类【实现类】
 *
 *  定义  使用   注意
 *
 *  抽象类使用注意：抽象类和抽象方法必须使用abstract关键字修饰
 *                可以定义静态属性、静态方法需要加{}，不可以定义抽象属性
 *                可以存在构造器、不可以定义静态抽象方法、不可以定义抽象静态属性
 *                可以存在内部类和静态内部类，可以继承抽象类，
 *                Java只允许单继承，实现只需要继承抽象类
 *                final不能修饰抽象方法
 */
abstract /*static*/  class Animals{  //①可以使用static
    //类定义： 修饰符 [abstract / static] class 类名{}
    public abstract void say();//抽象方法：没有任何实现
    //②定义修饰final[锁死]的抽象方法  ×
   // public final abstract void sleep();
    //③定义抽象属性  ×|定义静态属性  √
    //abstract int i;
    static int i; //声明未赋值
    //④定义抽象静态属性   ×
    // abstract static int j;
    //⑤定义静态抽象方法   ×  语法；修饰符[static abstract]返回值 方法名
   // public static abstract void eat();
    //⑥定义静态方法   √   需要加代码块{}  括号一定是空的 实现类不需要一定实现
    public static void eat(){};
    //⑦可以存在内部类 √   可以存在静态内部类  √
    public static class Sos{}
    //⑧抽象类存在构造器  √

    public Animals() {
    }
}
//⑨抽象类可以继承抽象类   √
abstract class Thing extends Animals{
    //成员变量
    protected abstract int result();
}

//实现类：子类 继承 抽象类  完成：抽象类方法
//⑩实现类【子类】可以继承两个抽象类  ×  但是，实现最终继承[子]抽象类
class People extends Animals{
    public void say() {
        System.out.println("人--说话--");

    }
}
//实现类：假设 Animals 有俩抽象方法  请问：子类需要实现抽象类全部抽象方法
class Monkey extends Animals{
    public void say() {
        System.out.println("猴--说话--");
    }
}
public class 抽象类 {
    public static void main(String[] args) {
        //抽象类  实例化【创建对象】--多态：向上造型
        Animals a=new People();
          a.say(); //输出：重写后的值  【方法互通】
        //实现抽象类实例化
        Animals a1=new Monkey();
        a1.say();//输出：重写后的值 【方法互通】

    }
}
